home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / doom / ldhe-src.0 / ldhe-src / dehacked / source / ttyobj.cc < prev    next >
C/C++ Source or Header  |  1995-04-20  |  5KB  |  260 lines

  1.  
  2. // Nice to use C++ for object orientedness for once. ;)
  3. // 
  4. // A class describing and giving access to a frame-buffered screen. :)
  5. //
  6. //    -Sam Lantinga        3/18/95
  7.  
  8. #include <sys/types.h>
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <assert.h>
  12.  
  13. #if defined(HAVE_VGA) && defined(linux)
  14. #include <linux/vt.h>
  15. #endif
  16.  
  17. #include "dehacked.h"
  18.  
  19. #undef TEXT
  20. #undef WIDTH
  21. #undef HEIGHT
  22. #include "ttyobj.h"
  23.  
  24. TTY::TTY(int lines, int cols) {
  25. #if defined(HAVE_VGA) && defined(linux)
  26.     struct vt_stat stats;
  27. #endif
  28.     int i, j;
  29.  
  30. #if defined(HAVE_VGA) && defined(linux)
  31.     // Figure out what kind of display we have.
  32.     if ( (geteuid() == 0) && (ioctl(2, VT_GETSTATE, &stats) == 0) ) {
  33.         // We're in a Linux console with VGA permissions.
  34.         graphics = new VGA_Graphics;
  35.     } else
  36. #endif
  37.     if ( getenv("DISPLAY") != NULL ) {
  38.         // We're in an X11 display.
  39.         graphics = new X11_Graphics;
  40.     } else {
  41.         // Assume a vt100 window.
  42.         graphics = new TTY_Graphics;
  43.     }
  44.     keyboard = graphics->keyboard;
  45.  
  46.     memory = new char*[lines];
  47.     for ( i=0; i<lines; ++i )
  48.         memory[i] = new char[cols*2];
  49.     maxy=lines; maxx=cols;
  50.     for ( i=0; i<maxy; ++i ) {
  51.         for ( j=0; j<maxx; ++j ) {
  52.             memory[i][j*2]=' ';
  53.             memory[i][(j*2)+1]=0;
  54.         }
  55.     }
  56.     oldx=oldy=curx=cury=0;
  57.     currattr=0;
  58. }
  59.  
  60. TTY:: ~TTY()
  61. {
  62.     delete graphics;
  63.     delete memory;
  64. }
  65.  
  66. void
  67. TTY:: moveto(int x, int y) {
  68.     // Check bounds..
  69.     if ( (x > maxx) || (y > maxy) ) {
  70.         moveto(maxx, maxy);
  71.         return;
  72.     }
  73.  
  74.     // Move to new position.
  75.     oldx=curx;
  76.     oldy=cury;
  77.     curx=x-1;
  78.     cury=y-1;
  79.     graphics->gotoxy(x, y);
  80.     graphics->flush();
  81. }
  82. void
  83. TTY:: curpos(int *x, int *y) {
  84.     *x=curx+1;
  85.     *y=cury+1;
  86. }
  87. void
  88. TTY:: clear(void) {
  89.     TTY::attrib(0);
  90.     for ( int i=0; i<maxy; ++i ) {
  91.         for ( int j=0; j<maxx; ++j ) {
  92.             memory[i][j*2]=' ';
  93.             memory[i][(j*2)+1]=0;
  94.         }
  95.     }
  96.     graphics->clear();
  97.     graphics->flush();
  98. }
  99. void
  100. TTY:: clrbox(int x, int y, int width, int height) {
  101.     // Check bounds..
  102.     assert((x > 0) && (x <= maxx));
  103.     assert((y > 0) && (y <= maxy));
  104.  
  105.     for ( int i=y-1; (i<(y+height-1))&&(i<maxy); ++i ) {
  106.         for ( int j=x-1; (j<(x+width-1))&&(j<maxx); ++j ) {
  107.             memory[i][(j*2)] = ' ';
  108.             memory[i][(j*2)+1] = currattr;
  109.         }
  110.     }
  111.     graphics->clrbox(x, y, width, height);
  112.     graphics->flush();
  113. }
  114. void
  115. TTY:: clreol(void) {
  116.     while ( curx < 80 )
  117.         memory[cury][(curx++)*2]=' ';
  118.     graphics->clreol();
  119.     graphics->flush();
  120. }
  121. void
  122. TTY:: putch(char ch) {
  123.     memory[cury][curx*2]=ch;
  124.     memory[cury][(curx*2)+1]=currattr;
  125.     // Wrap and/or scroll.  -- Uhhh, don't scroll.
  126.     if ( curx+1 == maxx ) {
  127.         if ( cury+1 < maxy ) {
  128.             ++cury;
  129.         }
  130.         curx=0;
  131.     } else
  132.         ++curx;
  133.     // Write, but don't flush.
  134.     graphics->putch(ch);
  135. }
  136. void
  137. TTY:: flush(void) {
  138.     graphics->flush();
  139. }
  140. void
  141. TTY:: attrib(int attr) {
  142.  
  143. #ifdef NO_COLOR
  144.     return;
  145. #else
  146.     int bright=0, bg=0, fg=0;
  147.  
  148.     if ( attr == currattr )
  149.         return;
  150.  
  151.     switch (attr) {
  152.         case INFO:    bright+=BRIGHT; fg+=WHITE; bg+=CYAN;
  153.                 break;
  154.         case INFGRAY:    fg+=WHITE; bg+=CYAN;
  155.                 break;
  156.         case INFDGRAY:    bright+=DIM; fg+=WHITE; bg+=CYAN;
  157.                 break;
  158.         case ERROR:    bright+=BRIGHT; fg+=WHITE; bg+=RED;
  159.                 break;
  160.         case INPUT:    bright+=BRIGHT; fg+=WHITE; bg+=GREEN;
  161.                 break;
  162.         case INPDGRAY:    bright+=DIM; fg+=WHITE; bg+=GREEN;
  163.                 break;
  164.         case INPHILIT:    fg+=MAGENTA; bg+=GREEN;
  165.                 break;
  166.         case NGRAY:    fg+=WHITE; bg+=BLUE;
  167.                 break;
  168.         case NORMAL:    bright+=BRIGHT; fg+=WHITE; bg+=BLUE;
  169.                 break;
  170.         case NERROR:    fg+=RED; bg+=BLUE;
  171.                 break;
  172.         case NHILIT:    fg+=BLUE; bg+=WHITE;
  173.                 break;
  174.         default:    currattr=0;
  175.                 graphics->set_default_colors();
  176.                 graphics->flush();
  177.                 return;
  178.     }
  179.     currattr=((bright<<6)|(fg<<3)|bg);
  180.     graphics->set_colors(bright, fg, bg);
  181.     graphics->flush();
  182. #endif
  183. }
  184.  
  185. void
  186. TTY:: highlight(int x, int y, int attr) {
  187.     // Check bounds..
  188.     assert(x <= maxx);
  189.     assert(y <= maxy);
  190.  
  191.     TTY::attrib(attr);
  192.     memory[y-1][((x-1)*2)+1] = currattr;
  193.     graphics->gotoxy(x, y);
  194.     graphics->putch(memory[y-1][(x-1)*2]);
  195.     graphics->flush();
  196. }
  197.  
  198. void
  199. TTY:: gettext(int left, int top, int right, int bottom, char *buffer) {
  200.     for ( int i=top; i<=bottom && i<=maxy; ++i ) {
  201.         for ( int j=left; j<=right && j<=maxx; ++j ) {
  202.             *(buffer++)=memory[i-1][(j-1)*2];
  203.             *(buffer++)=memory[i-1][((j-1)*2)+1];
  204.         }
  205.     }
  206. }
  207. void
  208. TTY:: puttext(int left, int top, int right, int bottom, char *buffer)
  209. {
  210.     char attr=0, a, c;
  211.     int bright, fg, bg;
  212.  
  213.     for ( int i=top; i<=bottom && i<=maxy; ++i ) {
  214.         graphics->gotoxy(left, i);
  215.         for ( int j=left; j<=right && j<=maxx; ++j ) {
  216.             c = *(buffer++);
  217.             memory[i-1][(j-1)*2] = c;
  218.             a = *(buffer++);
  219.             memory[i-1][((j-1)*2)+1] = a;
  220.  
  221.             // Update the screen.
  222.             if ( a != attr ) {
  223.                 bright = ((a>>6)&0x07);
  224.                 fg = ((a>>3)&0x07);
  225.                 bg = (a&0x07);
  226.                 graphics->set_colors(bright, fg, bg);
  227.                 attr=a;
  228.             }
  229.             graphics->putch(c);
  230.         }
  231.     }
  232.     graphics->flush();
  233. }
  234.  
  235. void
  236. TTY:: refresh(void)
  237. {
  238.     char *screenbuf = new char[maxx*maxy*2];
  239.  
  240.     gotoxy(1, 1);
  241.     gettext(1, 1, maxx, maxy, screenbuf);
  242.     puttext(1, 1, maxx, maxy, screenbuf);
  243.     delete[] screenbuf;
  244. }
  245.  
  246. #ifdef NOT_FINISHED
  247. void
  248. TTY:: scroll(void) {
  249.     // Scroll lines...
  250.     for ( int i=1; i<maxy; ++i )
  251.         memcpy(memory[i-1], memory[i], (maxx+1)*2);
  252.  
  253.     // Empty bottom line.
  254.     for ( int j=0; j<maxx; ++j ) {
  255.         memory[i-1][j*2]=' ';
  256.         memory[i-1][(j*2)+1]=0;
  257.     }
  258. }
  259. #endif
  260.